/* speed test for basic CPU operations  */


/* Marco Bucci <marco.bucci@inwind.it> */

/* This code was developed with the Code Warrior integrate ppc assembler.
 * Macros are use to hide illegal constructs whether you are using a 
 * "normal" assembler or the "C integrated" assembler.
 */

#if 0


    .text
    .align 4
    
    .globl b_call_reg
    .globl _b_call_reg
    .globl b_call_imm
    .globl _b_call_imm
    .globl b_add
    .globl _b_add
    .globl b_load
    .globl _b_load

.set fsize, 64
.set lrsave, 8

#else

#define fsize 64
#define lrsave 8

#endif




#if 0
.if 0
#endif
asm void b_null(void)
{
#if 0
.endif
#endif

#if 0
b_null:
#endif

    blr

#if 0
.if 0
#endif
}
#if 0
.endif
#endif


/* actually the same as the following. How to get "b_null" address?
 * I didnt find the right sintax or the right way.
 * I should take the current PC, then the difference to "b_null"
 * (making the difference beween the labels), perform the sum and go?! 
 */  
#if 0
.if 0
#endif
asm void b_call_reg(long n)
{
#if 0
.endif
#endif

#if 0
b_call_reg:
_b_call_reg:
#endif

    mflr    r0
    stw        r31,-4(r1)
    stw        r30,-8(r1)
    stw        r0,lrsave(r1)
    stwu    r1,-fsize(r1)
    mr        r30,r3
    li        r31,0
    
    b        L1
L0:
    bl        b_null
    bl        b_null
    bl        b_null
    bl        b_null
    bl        b_null

    addi       r31,r31,5
L1:
    cmpw       r31,r30
    blt        L0
    
    
    lwz        r0,lrsave+fsize(r1)
    mtlr       r0
    lwz        r31,-4+fsize(r1)
    lwz        r30,-8+fsize(r1)
    addi       r1,r1,fsize
    blr

#if 0
.if 0
#endif
}
#if 0
.endif
#endif




#if 0
.if 0
#endif
asm void b_call_imm(long n)
{
#if 0
.endif
#endif

#if 0
b_call_imm:
_b_call_imm:
#endif

    mflr    r0
    stw        r31,-4(r1)
    stw        r30,-8(r1)
    stw        r0,lrsave(r1)
    stwu    r1,-fsize(r1)
    mr        r30,r3
    li        r31,0
    
    b        L3
L2:
    bl        b_null
    bl        b_null
    bl        b_null
    bl        b_null
    bl        b_null

    addi       r31,r31,5
L3:
    cmpw       r31,r30
    blt        L2
    
    
    lwz        r0,lrsave+fsize(r1)
    mtlr       r0
    lwz        r31,-4+fsize(r1)
    lwz        r30,-8+fsize(r1)
    addi       r1,r1,fsize
    blr

#if 0
.if 0
#endif
}
#if 0
.endif
#endif



#if 0
.if 0
#endif
asm void b_add(long n)
{
#if 0
.endif
#endif

#if 0
b_add:
_b_add:
#endif

    mflr    r0
    stw        r31,-4(r1)
    stw        r30,-8(r1)
    stw        r0,lrsave(r1)
    stwu    r1,-fsize(r1)
    mr        r30,r3
    li        r31,0
    
    b        L5
L4:
    addi    r3,r3,5
    addi    r4,r4,5
    addi    r5,r5,5
    addi    r6,r6,5
    addi    r7,r7,5

    addi    r3,r3,5
    addi    r4,r4,5
    addi    r5,r5,5
    addi    r6,r6,5
    addi    r7,r7,5

    addi       r31,r31,10
L5:
    cmpw       r31,r30
    blt        L4
    
    
    lwz        r0,lrsave+fsize(r1)
    mtlr       r0
    lwz        r31,-4+fsize(r1)
    lwz        r30,-8+fsize(r1)
    addi       r1,r1,fsize
    blr

#if 0
.if 0
#endif
}
#if 0
.endif
#endif



#if 0
.if 0
#endif
asm void b_load(long n)
{
#if 0
.endif
#endif

#if 0
b_load:
_b_load:
#endif

    mflr    r0
    stw        r31,-4(r1)
    stw        r30,-8(r1)
    stw        r0,lrsave(r1)
    stwu    r1,-fsize(r1)
    mr        r30,r3
    li        r31,0
    
    b        L7
L6:
    lwz        r3,4(r1)
    lwz        r4,8(r1)
    lwz        r5,12(r1)
    lwz        r6,16(r1)
    lwz        r7,20(r1)

    lwz        r3,24(r1)
    lwz        r4,28(r1)
    lwz        r5,32(r1)
    lwz        r6,36(r1)
    lwz        r7,40(r1)


    addi       r31,r31,10
L7:
    cmpw       r31,r30
    blt        L6
    
    
    lwz        r0,lrsave+fsize(r1)
    mtlr       r0
    lwz        r31,-4+fsize(r1)
    lwz        r30,-8+fsize(r1)
    addi       r1,r1,fsize
    blr

#if 0
.if 0
#endif
}
#if 0
.endif
#endif
